package main

import "fmt"

/*
工厂方法模式中,工厂和产品都是抽象的,简单工厂模式中只有产品返回的是抽象的(也可以不返回抽象的)
*/

// 水果类抽象
type Fruit interface {
	Show()
}

type apple struct {
}

func (a apple) Show() {
	fmt.Println("这是苹果...")
}

type banana struct {
}

func (b banana) Show() {
	fmt.Println("这是香蕉...")
}

type waterMelon struct {
}

func (w waterMelon) Show() {
	fmt.Println("这是西瓜...")
}

// 抽象工厂
type AbstructFactory interface {
	Create() Fruit
}

type AppleFactory struct {
}

func (a AppleFactory) Create() Fruit {
	return new(apple)
}

type BananaFactory struct {
}

func (a BananaFactory) Create() Fruit {
	return new(banana)
}

type WaterMelonFactory struct {
}

func (a WaterMelonFactory) Create() Fruit {
	return new(waterMelon)
}

func main() {
	//声明一个抽象工厂类型变量
	var appleFac AbstructFactory
	//它指向一个苹果工厂
	appleFac = new(AppleFactory)
	//声明一个抽象水果类型变量
	var appleObj Fruit
	//使用抽象工厂创建一个抽象水果
	appleObj = appleFac.Create()
	//调用抽象工厂返回对象的方法
	appleObj.Show()

	//以下是省略写法...

	//声明一个抽象工厂类型变量
	var BananaFac AbstructFactory
	//它指向一个香蕉工厂
	BananaFac = new(BananaFactory)
	//调用香蕉工厂返回的对象
	BananaFac.Create().Show()

	//声明一个抽象工厂类型变量
	var WaterMelonFac AbstructFactory
	//它指向一个西瓜工厂
	WaterMelonFac = new(WaterMelonFactory)
	//调用西瓜工厂返回的对象
	WaterMelonFac.Create().Show()
}
